package com.zzyl.service.impl;

import com.google.common.collect.Lists;
import com.zzyl.constant.Constants;
import com.zzyl.dto.UserLoginRequestDto;
import com.zzyl.entity.Member;
import com.zzyl.mapper.MemberMapper;
import com.zzyl.properties.JwtProperties;
import com.zzyl.service.CustomerUserService;
import com.zzyl.service.WechatService;
import com.zzyl.utils.JwtUtil;
import com.zzyl.utils.ObjectUtil;
import com.zzyl.utils.StringUtils;
import com.zzyl.vo.LoginVo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

@Service
@Slf4j
public class CustomerUserServiceImpl implements CustomerUserService {

    @Autowired
    private WechatService wechatService;

    @Autowired
    private MemberMapper memberMapper;

    @Autowired
    private JwtProperties jwt;


    /*static ArrayList DEFAULT_NICKNAME_PREFIX = Lists.newArrayList(
            "生活更美好",
            "大桔大利",
            "日富一日",
            "好柿开花",
            "柿柿如意",
            "一椰暴富",
            "大柚所为",
            "杨梅吐气",
            "天生荔枝"
    );*/

    /**
     * 用户登录
     *
     * @param dto 用户登录请求参数
     * @return LoginVo 登录成功返回的Vo对象，包含token和用户昵称
     */
    @Override
    public LoginVo login(UserLoginRequestDto dto) {

        // 根据微信code获取用户openId
        String openid = wechatService.getOpenid(dto.getCode());
        log.info("openid:{}", openid);

        // 根据openId查询用户信息
        Member member = memberMapper.getByOpenId(openid);

        // 如果用户不存在，则新增用户
        if (member == null) {
            member = new Member();
            member.setOpenId(openid);
        }

        // 获取并保存或更新用户绑定的手机号
        String phoneNumber = wechatService.getPhoneNumber(dto.getPhoneCode());
        log.info("phone:{}", phoneNumber);

        // 如果用户不存在，则新增用户
        if (member.getId() == null) {
            member.setPhone(phoneNumber);
            member.setName(phoneNumber.substring(phoneNumber.length() - 4));
            memberMapper.insert(member);
        } else {
            // 如果用户存在，则更新用户绑定的手机号
            if (!member.getPhone().equals(phoneNumber)) {
                member.setPhone(phoneNumber);
                memberMapper.update(member);
            }
        }

        // 生成并返回登录token
        HashMap<String, Object> claims = new HashMap<>();
        claims.put(Constants.JWT_USERID, member.getId());
        claims.put(Constants.JWT_USERNAME, member.getName());

        // 生成token
        String token = JwtUtil.createJWT(jwt.getBase64EncodedSecretKey(), jwt.getTtl(), claims);

        // 封装返回结果
        LoginVo loginVo = new LoginVo();
        loginVo.setToken(token);
        loginVo.setNickName(member.getName());

        return loginVo;
    }


    /**
     * 保存或修改客户信息。
     * 该方法首先会检查传入的手机号是否与会员现有的手机号不同，如果不同，则更新手机号。
     * 接着，如果会员ID存在，则进行更新操作；如果ID不存在，则创建一个新的会员记录。
     * 对于新创建的会员，会随机生成一个昵称，该昵称由一组默认前缀和手机号的后四位组成。
     *
     * @param member 包含会员信息的对象，如果会员ID存在，表示进行更新操作；如果不存在，表示进行插入操作。
     * @param phone 会员的手机号，用于更新或创建会员时使用。
     */
    /*    private void saveOrUpdate(Member member, String phone) {

        // 检查手机号是否发生变化，若发生变化，则更新手机号


        // 判断会员ID是否存在，若存在则更新，不存在则插入


        // 为新会员生成昵称，并插入到数据库

        // 使用默认昵称前缀和手机号后四位组合生成昵称

    }*/
}
